'''
Created on 02/09/2013

@author: daniel
'''
import unittest
import nodoGeneral
import listaEnlazada

class ArbolGeneral(object):
    '''
    clase que se asocia con nodoGeneral 
    y con listaEnlazada
    '''
    def __init__(self,nodo):
        self.raiz=nodo
        
    def getRaiz(self):
        return self.raiz
    
    def setRaiz(self,unNodoGeneral):
        self.raiz=unNodoGeneral

    def getDatoRaiz(self):
        return self.raiz.getDato()
        
    def agregarHijo(self,unHijo):
        if(self.raiz.getHijos().esVacia()):
            self.raiz.setHijos(listaEnlazada.ListaEnlazada())
        self.raiz.getHijos().agregar(unHijo,self.raiz.getHijos().getTamanio())

    def getHijos(self):
        return self.raiz.getHijos()
        
    def eliminarHijo(self,arbol):
        i=0
        while (i<self.raiz.getHijos().getTamanio()):
            if(self.raiz.getHijos().elemento(i) is arbol):
                return self.raiz.getHijos().eliminar(i)
            else: i+=1
         
class Test(unittest.TestCase):

    def testInit(self):
        self.assertIsInstance(ArbolGeneral(None),ArbolGeneral, "testea creaciona de arbol")

    def testGetRaiz(self):
        obj=ArbolGeneral("a")
        raiz=obj.getRaiz()
        self.assertEquals(obj.raiz,raiz,"Verifica la existencia de raiz")

    def testSetRaiz(self):
        obj=ArbolGeneral("a")
        nodo=nodoGeneral.NodoGeneral(None)
        obj.setRaiz(nodo)
        self.assertEquals(obj.raiz,nodo,"Verifica seteo de raiz")
        

    
    def testGetDatoRaiz(self):
        obj=ArbolGeneral(1)
        obj.setRaiz(nodoGeneral.NodoGeneral(3))
        elem=obj.getDatoRaiz()
        self.assertEquals(obj.raiz.getDato(),elem,"Verifica la existencia de raiz")
        
    def testGetHijos(self):
        obj=ArbolGeneral(nodoGeneral.NodoGeneral(3))
        nodo=ArbolGeneral(3)
        obj.agregarHijo(nodo)
        self.assertTrue(obj.getHijos().incluye(nodo),"Verifica correcta entrega de hijo")
                    
    def testAgregarHijo(self):
        obj=ArbolGeneral(nodoGeneral.NodoGeneral(3))
        nodo=ArbolGeneral(nodoGeneral.NodoGeneral(4))
        nodo1=ArbolGeneral(nodoGeneral.NodoGeneral(5))
        nodo1.agregarHijo(ArbolGeneral(nodoGeneral.NodoGeneral(6)))
        obj.agregarHijo(nodo)
        nodo.agregarHijo(nodo1)
        self.assertTrue(obj.raiz.getHijos().incluye(nodo),"Verifica correcta inclusion de hijo")
        self.assertFalse(obj.raiz.getHijos().incluye(nodo1),"Verifica correcta no existencia de hijo")
        self.assertTrue(obj.getRaiz().getHijos().elemento(0).getHijos().incluye(nodo1),"Verifica correcta existencia de nieto")
        self.assertEquals(obj.getRaiz().getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz(),6,"Verifica correcta existencia de tatara nieto")

    def testEliminarHijo(self):
        obj=ArbolGeneral(nodoGeneral.NodoGeneral(3))
        nodo=ArbolGeneral(5)
        obj.agregarHijo(nodo)
        self.assertTrue(obj.raiz.getHijos().incluye(nodo),"Verifica correcta inclusion de hijo")
        obj.eliminarHijo(nodo)
        self.assertFalse(obj.raiz.getHijos().incluye(nodo),"Verifica correcta eliminacion de hijo")


if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testInit']
    unittest.main()